package com.example.demo.webofficeImpl;

import cn.ljserver.tool.weboffice.v3.exception.FileNotExist;
import cn.ljserver.tool.weboffice.v3.model.FileInfo;
import cn.ljserver.tool.weboffice.v3.model.FileUploadSinglePhase;
import cn.ljserver.tool.weboffice.v3.service.SinglePhaseFileStorageService;
import cn.ljserver.tool.weboffice.v3.util.HeaderUtils;
import com.example.demo.entity.File;
import com.example.demo.service.MyFileService;
import com.example.demo.service.QnFileService;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;

import java.time.LocalDateTime;
import java.util.Optional;

/**
 * 单阶段文件保存接口
 * <p>
 * <a href="https://solution.wps.cn/docs/callback/save.html#%E5%8D%95%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4">详见wps web office官网</a>
 */
@Component
public class SinglePhaseFileStorageServiceImpl implements SinglePhaseFileStorageService {
    @Inject
    private MyFileService fileService;

    /**
     * 上传文件
     *
     * @param request 上传文件请求
     * @return 文件信息
     * <p>
     * <a href="https://solution.wps.cn/docs/callback/save.html#%E5%8D%95%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4">详见wps web office官网</a>
     */
    @Override
    public FileInfo uploadFile(FileUploadSinglePhase.Request request) {
        // 获取user信息
        // 通过token获取用户信息
        // 这里是将token中的id直接当成用户id，实际使用，应该是token需要在拦截器中做鉴权
        // 而userid应该是从token中解码来的，或者是 通过 HeaderUtils.getUserQuery 来获取，前提是，前端传递了此值
        // 即前端传递了 初始化了 customArgs 参数并赋值
        // <a href="https://solution.wps.cn/docs/web/quick-start.html#%E6%AD%A5%E9%AA%A4-3-%E5%88%9D%E5%A7%8B%E5%8C%96">前端初始化赋值，详见官网</a>
        long userId = Long.parseLong(HeaderUtils.getWebOfficeToken());

        // 保存文件信息
        final File file = Optional.of(request).map(r -> fileService.fetchFile(request.getFileId())).map(f -> File.builder().id(f.getId()).createTime(f.getCreateTime()).modifyTime(LocalDateTime.now()).modifierId(userId).creatorId(userId).version(f.copyForNewVersion()).name(request.getName()).size(request.getSize())

                // 上传文件获取到URL
                // --------------------------------
                // 这里不应该直接保存URL，而是不带domain的uri方便后续迁移等等
                // 为了方便，就这么弄了
                // --------------------------------

                .url(QnFileService.upload(request.getFile())).build()).map(f -> fileService.save(f)).orElseThrow(FileNotExist::new);

        // 返回文件信息
        return file.toFileInfo();
    }
}